package com.singleton.pattern.singleton;

import javax.swing.plaf.SpinnerUI;
import java.util.Date;

/**
 * @author cc
 * @classname LazySingleton
 * @description 懒汉式-延迟加载
 * @date 2022/3/29 23:11
 */
public class LazySingleton {

    //1、先分配内存，让 instance 指向这块内存 ，然后执行对象的初始化 ，
    //这种会有问题，在初始化执行没有完成 ，这时候 cpu 切换时间片 ，
    //导致其他线程执行 标记1时判断不为空，直接返回 ，但是对象还没有初始化完

    //volatile禁止指令重排序
    private volatile static LazySingleton singleton;

    //简单懒汉式（方法加锁）
    // 该方式变量可以不加 volatile关键字
    // 第一次调用才初始化，避免内存浪费
    // 必须加锁 synchronized 才能保证单例，但加锁会影响效率
    public static synchronized LazySingleton getSingleton1() {
        if (singleton == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }

    //懒汉式   DCL双重校验锁机制  该方式变量需要加 volatile关键字
    public static LazySingleton getSingleton2() {
        //第一次校验避免没必要的加锁
        if (singleton == null) {    //标记 1
            synchronized (LazySingleton.class) {
                //第二次校验例行检查   如果不校验就会创建多个对象
                if (singleton == null) {
                    singleton = new LazySingleton();    //可以理解 ：new 不是一个原子操作 ,指令可能会重排序
                }
            }
        }
        return singleton;
    }

}
